// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

#ifndef __BRDF_CG__
#define __BRDF_CG__


// ----------------------------------------------------
// @brief 兰伯特
// @param[L] 灯光的方向
// @param[V] 位置指向摄像机的方向
// @param[N] 世界法线
float3 BRDF_Lambert(float3 L, float3 V, float3 N, float3 albedo)
{
    return albedo * max(0, dot(N, L));
}
// ----------------------------------------------------
// @brief 半兰伯特
// @param[L] 灯光的方向
// @param[V] 位置指向摄像机的方向
// @param[N] 世界法线
float3 BRDF_HalfLambert(float3 L, float3 V, float3 N, float3 albedo)
{
    return albedo * max(0, dot(N, L) * 0.5 + 0.5);
}
// ----------------------------------------------------
// @brief 布林冯
// @param[L] 灯光的方向
// @param[V] 位置指向摄像机的方向
// @param[N] 世界法线
// @param[S] 光泽度
float3 BRDF_BlinnPhong(float3 L, float3 V, float3 N, float3 albedo, float specular, float gloss)
{
    float3 H = normalize(L+V);
    return albedo * specular * pow(max(0,dot(N,H)), gloss);
}
// ----------------------------------------------------
// @brief 冯
// @param[L] 灯光的方向
// @param[V] 位置指向摄像机的方向
// @param[N] 世界法线
// @param[S] 光泽度
float3 BRDF_Phong(float3 L, float3 V, float3 N, float3 albedo, float specular, float gloss)
{
    float3 R = normalize(reflect(-L, N));
    return albedo * specular * pow(max(0,dot(R,V)), gloss);
}
// ----------------------------------------------------
// @brief 冯修正
// @param[L] 灯光的方向
// @param[V] 位置指向摄像机的方向
// @param[N] 世界法线
// @param[S] 光泽度
float3 BRDF_ModifiedPhong(float3 L, float3 V, float3 N, float3 albedo, float specular, float gloss)
{
    float3 R = normalize(reflect(-L, N));
    float norm = (gloss+2)/(2*3.14159265358979323846);
    return albedo * specular * norm * pow(max(0,dot(R,V)), gloss);
}


// ----------------------------------------------------
// @brief 边缘光
// @param[L] 灯光的方向
// @param[V] 位置指向摄像机的方向
// @param[N] 世界法线
float3 BRDF_Rim(float3 L, float3 V, float3 N,  float rim_range, float3 rim_color, float3 albedo)
{
    return albedo + pow(1.0 - max(0, dot(N,V)), rim_range) * rim_color;
}




#endif
